﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// 用于在特定面板上显示单位信息的组件
/// 功能：响应点击事件，显示/隐藏选中单位的详细信息（名称、图标、描述等），并联动 Buff 信息显示
/// </summary>
public class ShowInfo : MonoBehaviour
{
    // 单位名称文本组件
    public Text unitName;
    // 主显示图标（通常为单位头像或主要特征图标）
    public Image primaryIcon;
    // 主描述文本（显示单位的主要属性或功能）
    public Text primaryText;
    // 次显示图标（用于辅助信息，如攻击类型、防御类型等）
    public Image secondaryIcon;
    // 次描述文本（补充说明主文本未涵盖的信息）
    public Text secondaryText;
    // 新增：引用 Buff 信息显示组件，用于同步更新单位的增益效果
    public BuffInfoDisplay buffInfoDisplay;

    /// <summary>
    /// 当组件被销毁时触发
    /// 功能：停止监听"UserClick"事件，避免内存泄漏
    /// </summary>
    void OnDestroy()
    {
        EventManager.StopListening("UserClick", UserClick);
    }

    /// <summary>
    /// 初始化阶段调用（在 Start 之前执行）
    /// 功能：校验必要子组件是否存在，确保 UI 显示功能正常
    /// </summary>
    void Awake()
    {
        // 断言校验：确保所有 UI 组件已正确赋值，否则抛出错误
        Debug.Assert(
            unitName && primaryIcon && primaryText && secondaryIcon && secondaryText && buffInfoDisplay,
            "ShowInfo组件缺少必要子组件"
        );
    }

    /// <summary>
    /// 组件启用时调用（仅执行一次）
    /// 功能：开始监听用户点击事件，并隐藏初始状态的单位信息面板
    /// </summary>
    void Start()
    {
        EventManager.StartListening("UserClick", UserClick); // 监听用户点击事件
        HideUnitInfo(); // 初始化时隐藏单位信息面板
    }

    /// <summary>
    /// 显示单位信息的核心方法
    /// 参数：info - 包含单位信息的 UnitInfo 对象
    /// 功能：根据传入的信息更新 UI 组件显示，并触发 Buff 信息更新
    /// </summary>
    public void ShowUnitInfo(UnitInfo info)
    {
        gameObject.SetActive(true); // 显示单位信息面板

        // 更新文本信息
        unitName.text = info.unitName;
        primaryText.text = info.primaryText;
        secondaryText.text = info.secondaryText;

        // 处理主图标显示
        if (info.primaryIcon != null)
        {
            primaryIcon.sprite = info.primaryIcon; // 设置图标资源
            primaryIcon.gameObject.SetActive(true); // 显示主图标
        }
        else
        {
            primaryIcon.gameObject.SetActive(false); // 无图标时隐藏
        }

        // 处理次图标显示
        if (info.secondaryIcon != null)
        {
            secondaryIcon.sprite = info.secondaryIcon; // 设置图标资源
            secondaryIcon.gameObject.SetActive(true); // 显示次图标
        }
        else
        {
            secondaryIcon.gameObject.SetActive(false); // 无图标时隐藏
        }

        // 新增：同步更新 Buff 信息显示（通过关联的 BuffInfoDisplay 组件）
        buffInfoDisplay.UpdateBuffDisplay(gameObject);
    }

    /// <summary>
    /// 隐藏单位信息的核心方法
    /// 功能：清空所有文本和图标显示，并隐藏面板，同时隐藏 Buff 信息
    /// </summary>
    public void HideUnitInfo()
    {
        // 清空文本内容
        unitName.text = primaryText.text = secondaryText.text = "";
        // 隐藏所有图标
        primaryIcon.gameObject.SetActive(false);
        secondaryIcon.gameObject.SetActive(false);
        // 隐藏单位信息面板
        gameObject.SetActive(false);
        // 新增：隐藏单位信息时一并隐藏 Buff 信息
        buffInfoDisplay.HideBuffInfo();
    }

    /// <summary>
    /// 用户点击事件的处理方法
    /// 参数：obj - 被点击的游戏对象（可能是单位或 UI 元素）
    ///       param - 事件参数（此处未使用）
    /// 功能：根据点击对象更新单位信息显示或隐藏面板
    /// </summary>
    private void UserClick(GameObject obj, string param)
    {
        HideUnitInfo(); // 先隐藏现有信息，避免残留

        if (obj != null)
        {
            // 获取点击对象的 UnitInfo 组件（用于存储单位信息）
            UnitInfo unitInfo = obj.GetComponent<UnitInfo>();
            if (unitInfo != null)
            {
                ShowUnitInfo(unitInfo); // 显示单位信息
                // 新增：触发 Buff 信息更新（传入点击的对象以获取其 Buff 列表）
                buffInfoDisplay.UpdateBuffDisplay(obj);
            }
            else
            {
                // 若点击对象无 UnitInfo 组件，说明不是有效单位，隐藏 Buff 显示
                buffInfoDisplay.HideBuffInfo();
            }
        }
    }
}